package guet.dream.category;

import guet.dream.question.Question;

import java.util.Set;


/***
 * 
 * 类别数据操作对象,如果不考虑性能问题,只调用findMainCategories()就可以得到全部的类别
 * 相关信息.如类别的子类别,类别的问题集合.
 * 
 * @author banxi1988
 *
 */
public interface CategoryDao {

	/***
	 *  查找出所有主类别.判断条件为category_code为0.
	 *  在此方法中,还同时递归的查询,每一个大类别的子类别.
	 *  同时查找每一个类别的Question集合放入questions集合中.
	 * @return 返回主类别的集合.
	 */
	Set<Category> findMainCategories();

	/***
	 * 查询,传递参数category对象的的子类别.category主要传递其category_code的作用.
	 * 查询出传递进来父类别的子类别.
	 * 并把子类别添加时大类别的categories Set集合中.
	 * 在内部,同时递归的调用自己以查询,所查出子类别的子类别.
	 * 同时在查询查出来的子类别的问题集.
	 * @param category
	 * @return 此类别的子类别集,包括递归查找得到的.
	 */
	Set<Category> findChildCategories(Category category);

	
	/***
	 * 查询出,相应类别的问题,并把问题添加进.
	 * 此类别的问题集当中.
	 * @param category
	 * @return 此类别的问题集.
	 */
	Set<Question> findQuestions(Category category);

	/**
	 * 以一个父类别代码即category_code保存一个新的类别.
	 * @param category 待保存的类别.
	 * @param parentId 父类别代码.
	 * @return 保存成功返回 1 (即受影响行数.) 失败返回0.
	 */
	int save(Category category, int parentId);

	
	/***
	 * 找出当前类别表中最大的category_code值.
	 * @return 返回category_code 列中的最大值.
	 */
	int findMaxId();

	/**
	 * 根据相应的类型删除相应的类别.
	 * @param categoryCode
	 * @return
	 */
	int remove(int categoryCode);

	/***
	 * 更新相应的类别. 注意类别码是判断是更新那一个纪录的条件.
	 * 返回受影响的行数
	 * @param category
	 * @return
	 */
	int update(Category category);

	/***
	 *  根据类别代码categoryCode.返回所查找的对象,查找不到返回空.
	 * @param categoryCode
	 * @return
	 */
	Category findCategoryById(int categoryCode);

}
